欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java垃圾回收之標(biāo)記清除算法詳解

 更新時(shí)間:2018年10月26日 15:43:25   作者:Sam哥哥  
今天小編就為大家分享一篇關(guān)于Java垃圾回收之標(biāo)記清除算法詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧

java垃圾回收算法之-引用計(jì)數(shù)器,這個(gè)算法其中一個(gè)優(yōu)點(diǎn)便是,實(shí)時(shí)性,只要對(duì)象的引用計(jì)數(shù)器的值為0,則立刻回收。接下來介紹的標(biāo)記清除算法,當(dāng)對(duì)象的引用計(jì)數(shù)器的值為0時(shí),不會(huì)立刻被回收的。

概念介紹

root對(duì)象

在標(biāo)記清除算法中,會(huì)把如下對(duì)象稱之為root對(duì)象

  1. 被棧中的變量(棧中存的是對(duì)象的引用)所引用的對(duì)象
  2. 被static變量引用的對(duì)象

可訪問的對(duì)象

如果棧中有一個(gè)變量a引用了一個(gè)對(duì)象,那么該對(duì)象是可訪問的,如果該對(duì)象中的某一個(gè)字段引用了另一個(gè)對(duì)象b,那么b也是可訪問的。可訪問的對(duì)象也稱之為live對(duì)象

標(biāo)記清除算法介紹

該算法有兩個(gè)階段。

1. 標(biāo)記階段:找到所有可訪問的對(duì)象,做個(gè)標(biāo)記
2. 清除階段:遍歷堆,把未被標(biāo)記的對(duì)象回收

備注:

  • 該算法一般應(yīng)用于老年代,因?yàn)槔夏甏膶?duì)象生命周期比較長(zhǎng)。

標(biāo)記階段算法

偽代碼類似如下:

for each root variable r
  mark (r);
sweep ();

為了能夠區(qū)分對(duì)象是live的,可以為每個(gè)對(duì)象添加一個(gè)marked字段,該字段在對(duì)象創(chuàng)建的時(shí)候,默認(rèn)值是false

假設(shè)有一個(gè)對(duì)象p,p對(duì)象還間接的引用了其他對(duì)象,那么可以使用一個(gè)遞歸算法去進(jìn)行標(biāo)記,例如:

void mark(Object p)
  if (!p.marked)
    p.marked = true;
    for each Object q referenced by p
      mark (q);

這個(gè)mark方法只有當(dāng)所有對(duì)象已經(jīng)被mark后才會(huì)退出。

清除階段算法

在這個(gè)階段,需要去遍歷堆中所有對(duì)象,并找出未被mark的對(duì)象,進(jìn)行回收。與此同時(shí),那些被mark過的對(duì)象的marked字段的值會(huì)被重新設(shè)置為false,以便下次的垃圾回收。

偽代碼如下:

void sweep ()
  for each Object p in the heap
    if (p.marked)
      p.marked = false
    else
      heap.release (p);

下面用一張圖來表示標(biāo)記清除算法的整個(gè)過程。

標(biāo)記清除算法的優(yōu)點(diǎn)和缺點(diǎn)

1. 優(yōu)點(diǎn)
- 是可以解決循環(huán)引用的問題
- 必要時(shí)才回收(內(nèi)存不足時(shí))

2. 缺點(diǎn):
- 回收時(shí),應(yīng)用需要掛起,也就是stop the world。
- 標(biāo)記和清除的效率不高,尤其是要掃描的對(duì)象比較多的時(shí)候
- 會(huì)造成內(nèi)存碎片(會(huì)導(dǎo)致明明有內(nèi)存空間,但是由于不連續(xù),申請(qǐng)稍微大一些的對(duì)象無(wú)法做到),如下圖:

解決循環(huán)引用

出現(xiàn)循環(huán)引用的代碼如下:

class TestA{
 public TestB b;
}
class TestB{
 public TestA a;
}
public class Main{
  public static void main(String[] args){
    A a = new A();
    B b = new B();
    a.b=b;
    b.a=a;
    a = null;
    b = null;
  }
}

對(duì)應(yīng)的圖如下:

這個(gè)時(shí)候,當(dāng)a = null; b = null;的時(shí)候,圖像變成如下:

那么使用標(biāo)記清除算法是可以回收a和b的,原因是標(biāo)記清除算法是從棧中根對(duì)象開始的,改算法走完后,a對(duì)象和b對(duì)象是沒有被標(biāo)記的,會(huì)被直接回收。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • 關(guān)于yml文件字符串,List,Map的書寫方式并使用@ConfigurationProperties注入配置類

    關(guān)于yml文件字符串,List,Map的書寫方式并使用@ConfigurationProperties注入配置類

    這篇文章主要介紹了關(guān)于yml文件字符串,List,Map的書寫方式并使用@ConfigurationProperties注入配置類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 解決IDEA創(chuàng)建第一個(gè)spring boot項(xiàng)目提示cannot resolve xxx等錯(cuò)誤

    解決IDEA創(chuàng)建第一個(gè)spring boot項(xiàng)目提示cannot resolve xxx等

    這篇文章主要介紹了解決IDEA創(chuàng)建第一個(gè)spring boot項(xiàng)目提示cannot resolve xxx等錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringAnimation 實(shí)現(xiàn)菜單從頂部彈出從底部消失動(dòng)畫效果

    SpringAnimation 實(shí)現(xiàn)菜單從頂部彈出從底部消失動(dòng)畫效果

    最近做項(xiàng)目遇到這樣一個(gè)需求,要求實(shí)現(xiàn)一種菜單,菜單從頂部彈入,然后從底部消失,頂部彈入時(shí),有一個(gè)上下抖動(dòng)的過程,底部消失時(shí),先向上滑動(dòng),然后再向下滑動(dòng)消失。下面給大家?guī)砹藢?shí)現(xiàn)代碼,感興趣的朋友一起看看吧
    2018-05-05
  • springboot對(duì)接minio的webhook完整步驟記錄

    springboot對(duì)接minio的webhook完整步驟記錄

    Minio是一款開源的對(duì)象存儲(chǔ)服務(wù),它致力于為開發(fā)者提供簡(jiǎn)單、高性能、高可用的云存儲(chǔ)解決方案,下面這篇文章主要給大家介紹了關(guān)于springboot對(duì)接minio的webhook的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Java學(xué)習(xí)之緩沖流的原理詳解

    Java學(xué)習(xí)之緩沖流的原理詳解

    為了提高其數(shù)據(jù)的讀寫效率,Java中又定義了四種緩沖流,分別是:字節(jié)緩沖輸入流、字節(jié)緩沖輸出流、字符緩沖輸入流和字符緩沖輸出流。本文主要來和大家聊聊這些緩沖流的原理,希望對(duì)大家有所幫助
    2023-01-01
  • Java判斷變量是否為空問題的方法總結(jié)

    Java判斷變量是否為空問題的方法總結(jié)

    項(xiàng)目中經(jīng)常遇到對(duì)象判空,下面這篇文章主要給大家介紹了關(guān)于Java判斷變量是否為空問題的方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-04-04
  • java解析json數(shù)組方式

    java解析json數(shù)組方式

    這篇文章主要介紹了java解析json數(shù)組方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解Java中restTemplate的使用

    詳解Java中restTemplate的使用

    這篇文章主要為大家詳細(xì)介紹了Java中restTemplate用法的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下
    2022-11-11
  • MyBatis/mybatis-plus項(xiàng)目打印SQL的方法實(shí)現(xiàn)

    MyBatis/mybatis-plus項(xiàng)目打印SQL的方法實(shí)現(xiàn)

    SpringBoot項(xiàng)目中,經(jīng)常需要打印SQL語(yǔ)句及其參數(shù),本文就來介紹一下MyBatis/mybatis-plus項(xiàng)目打印SQL的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • Java中String、StringBuffer、StringBuilder的區(qū)別詳解

    Java中String、StringBuffer、StringBuilder的區(qū)別詳解

    java中String、StringBuffer、StringBuilder是編程中經(jīng)常使用的字符串類,他們之間有什么區(qū)別呢?下面小編給大家總結(jié)了Java中String、StringBuffer、StringBuilder的區(qū)別詳解,需要的朋友參考下吧
    2016-06-06

最新評(píng)論